package com.thread;

import com.sun.corba.se.spi.orbutil.threadpool.ThreadPool;

import javax.imageio.ImageTranscoder;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 不使用锁的前提下，使用多线程顺序打印100-200的数字
 * 错误思路：线程按顺序启动。
 * 正确思路：按顺序打印，让线程一起启动。
 *
 * @author yinxing
 * @date 2022-09-06
 */
public class ThreadPrint {

//    static volatile int flag = -1;
//    static AtomicInteger NUM = new AtomicInteger(100);
//
//    public static void main(String[] args) {
//        //等同于使用了锁
//        Semaphore semaphore = new Semaphore(1);
//        for (int i = 0; i < 101; i++) {
//            new Thread(() -> {
//                boolean isAcquired = false;
//                try {
//                    semaphore.acquire();
//                    System.out.println(Thread.currentThread().getName() + "处理:" + NUM.getAndIncrement());
//                    isAcquired = true;
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                } finally {
//                    if (isAcquired){
//                        semaphore.release();
//                    }
//                }
//            }).start();
//        }
//    }


//    static volatile int flag = -1;
//    static AtomicInteger NUM = new AtomicInteger(100);
//    static CountDownLatch CDL = new CountDownLatch(100);
//
//    public static void main(String[] args) {
//        for (int i = 0; i < 101; i++) {
//            int finalI = i;
//            new Thread(() -> {
//                while (true) {
//                    if (finalI == 100 - CDL.getCount()) {
//                        System.out.println(Thread.currentThread().getName() + "处理:" + NUM.getAndIncrement());
//                        CDL.countDown();
//                        break;
//                    }
//                }
//            }, "thread" + i).start();
//        }
//    }
//
//    private static volatile Integer num = 100;
//    static volatile Integer count = 100;
//    static AtomicInteger NUM = new AtomicInteger(100);
//    static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4, 5, 1000, TimeUnit.MILLISECONDS,
//            new LinkedBlockingDeque<>());
//
//    /**
//     * 使用锁打印
//     * @param args
//     */
//    public static void main(String[] args) {
//        for (int i = 0; i < 101; i++) {
//            threadPoolExecutor.execute(new Runnable() {
//                @Override
//                public void run() {
//                    synchronized (num) {
//                        System.out.println(count++);
//                    }
//                }
//            });
//        }
//    }



}
